package com.cw;

public class Test {
    public static void main(String[] args) {
        //创建对象（多态方式）
        // Fu f = new Zi();
        Animal a = new Dog();
        // 调用成员变量：编译看左边，运行也看左边
        // 编译看左边：javac编译代码的时候，会看左边的父类中有没有这个变量，如果有则编译成功，没有则编译失败
        // 运行也看左边：Java运行代码的时候，实际获取的就是左边父类中成员变量中的值
        System.out.println(a.name); // 动物

        // 调用成员方法:编译看左边，运行看右边
        // 编译看左边：编译看左边：javac编译代码的时候，会看左边的父类中有没有这个变量，如果有则编译成功，没有则编译失败
        // 运行看右边：Java运行代码的时候，实际上运行的是子类中的方法
//        a.show(); // Dog --- show方法

        // 判断a是否为Dog类型，如果是，则强转为Dog类型
        // (否则调用不了子类中特有的方法，只能调用子类中重写的方法)
        if (a instanceof Dog) {
            Dog d = (Dog) a;
            d.look();
        } else if (a instanceof Cat) {
            Cat c = (Cat) a;
            c.mouse();
        } else {
            System.out.println("没有这个类型，无法转换");
        }
    }

    static class Animal {
        String name = "动物";

        public void show() {
            System.out.println("Animal --- show方法");
        }
    }

    static class Dog extends Animal {
        String name = "狗";

        public void show() {
            System.out.println("Dog --- show方法");
        }

        public void look() {
            System.out.println("看门狗");
        }
    }

    static class Cat extends Animal {
        String name = "猫";

        public void show() {
            System.out.println("Cat --- show方法");
        }

        public void mouse() {
            System.out.println("爱抓老鼠");
        }
    }
}
